package main

import (
	"context"
	"fmt"
	"time"
)

// 1. context在整体上看就是一个树，每个节点只能存储一个kv对
// 2. Background() 创建一个根节点
// 3. WithValue() 父context衍生一个子context，并将key/value对保存到子节点。
// 4. Value() 从某个节点取出Value，子节点可以取到父节点的kv。

func main() {
	root := context.Background()
	ctx1, _ := context.WithDeadline(root, time.Now().Add(6*time.Second))
	// ctx1, cancel := context.WithCancel(root)
	ctx2 := context.WithValue(ctx1, "key2", "value2")
	fmt.Println(ctx1.Value("key1"))
	fmt.Println(ctx2.Value("key2"))
	fmt.Println(ctx2.Value("key3"))
	go watch(ctx2)
	// time.Sleep(10 * time.Second)
	time.Sleep(7 * time.Second)
	// fmt.Println("通知监控停止")
	// cancel()

}
func watch(ctx context.Context) {
	for {
		select {
		case <-ctx.Done():
			fmt.Println(ctx.Value("key2"), "监控退出来。")
			return
		default:
			fmt.Println(ctx.Value("key2"), "go rountine 监控中。。。")
			time.Sleep(2 * time.Second)
		}
	}
}
